package com.zp.system.service;


import com.zp.common.myBatis.core.page.PageQuery;
import com.zp.common.myBatis.core.page.TableDataInfo;
import com.zp.system.api.entity.SysRole;
import com.zp.system.entity.SysOrgGroupVsUser;
import com.zp.system.entity.SysUserRole;
import com.zp.system.entity.bo.AuthUserBo;

import java.util.List;
import java.util.Set;

/**
 * 角色业务层
 *
 * @author zhang peng
 */
public interface ISysRoleService {
    TableDataInfo<SysRole> selectPageRoleList (SysRole role, PageQuery pageQuery);

    /**
     * 根据条件分页查询角色数据
     *
     * @param role 角色信息
     * @return 角色数据集合信息
     */
    List<SysRole> selectRoleList (SysRole role);

    /**
     * 根据用户ID查询角色列表
     *
     * @param userId 用户ID
     * @return 角色列表
     */
    List<SysRole> selectRolesByUserId (String userId);

    /**
     * 根据用户ID查询角色权限
     *
     * @param userId 用户ID
     * @return 权限列表
     */
    Set<String> selectRolePermissionByUserId (String userId);

    /**
     * 查询所有角色
     *
     * @return 角色列表
     */
    List<SysRole> selectRoleAll ();

    /**
     * 根据用户ID获取角色选择框列表
     *
     * @param userId 用户ID
     * @return 选中角色ID列表
     */
    List<String> selectRoleListByUserId (String userId);

    /**
     * 通过角色ID查询角色
     *
     * @param roleId 角色ID
     * @return 角色对象信息
     */
    SysRole selectRoleById (String roleId);

    /**
     * 校验角色名称是否唯一
     *
     * @param role 角色信息
     * @return 结果
     */
    String checkRoleNameUnique (SysRole role);

    /**
     * 校验角色权限是否唯一
     *
     * @param role 角色信息
     * @return 结果
     */
    String checkRoleKeyUnique (SysRole role);

    /**
     * 校验角色是否允许操作
     *
     * @param role 角色信息
     */
    void checkRoleAllowed (SysRole role);

    /**
     * 校验角色是否有数据权限
     *
     * @param roleId 角色id
     */
    void checkRoleDataScope (String roleId);

    /**
     * 通过角色ID查询角色使用数量
     *
     * @param roleId 角色ID
     * @return 结果
     */
    long countUserRoleByRoleId (String roleId);

    /**
     * 新增保存角色信息
     *
     * @param role 角色信息
     * @return 结果
     */
    int insertRole (SysRole role);

    /**
     * 修改保存角色信息
     *
     * @param role 角色信息
     * @return 结果
     */
    int updateRole (SysRole role);

    /**
     * 修改角色状态
     *
     * @param role 角色信息
     * @return 结果
     */
    int updateRoleStatus (SysRole role);

    /**
     * 修改数据权限信息
     *
     * @param role 角色信息
     * @return 结果
     */
    int authDataScope (SysRole role);

    /**
     * 通过角色ID删除角色
     *
     * @param roleId 角色ID
     * @return 结果
     */
    int deleteRoleById (String roleId);

    /**
     * 批量删除角色信息
     *
     * @param roleIds 需要删除的角色ID
     * @return 结果
     */
    int deleteRoleByIds (String[] roleIds);

    /**
     * 取消授权用户角色
     *
     * @param userRole 用户和角色关联信息
     * @return 结果
     */
    int deleteAuthUser (SysUserRole userRole);


    /**
     * 批量取消授权用户角色
     *
     * @param roleId  角色ID
     * @param userIds 需要取消授权的用户数据ID
     * @return 结果
     */
    int deleteAuthUsers (String roleId, String[] userIds);

    /**
     * 批量选择授权用户角色
     *
     * @param bo roleId  角色ID
     * @param bo list 需要添加的用户数据ID
     * @return 结果
     */
    int insertAuthUsers (AuthUserBo bo);

    /**
     * 批量选择用户授权(科室)
     *
     * @param bo roleId  角色ID
     * @param bo list 需要添加的用户数据ID
     * @return 结果
     */
    int insertDeptGroupAuthUserSelectAll (AuthUserBo bo);

    /**
     * 取消授权用户(科室)
     *
     * @param groupVsUser 科室分组和角色关联信息
     * @return 结果
     */
    int deleteDeptGroupAuthUser (SysOrgGroupVsUser groupVsUser);

    /**
     * 批量取消科室分组授权用户(科室)
     *
     * @param deptGroupId 科室分组ID
     * @param userIds     需要取消授权的用户数据ID
     * @return 结果
     */
    int deleteDeptGroupAuthUsers (String deptGroupId, String[] userIds);

}
